package Persistencia;

import Clases.Cliente;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class PersistenciaCliente {

    public static int insertarCliente(Cliente cliente) {

        int insertado = 0;

        String codigoCliente;
        String nombre = cliente.getNombre();
        String direccion = cliente.getDireccion();
        String codigoPostal = cliente.getCodigoPostal();
        String movil = cliente.getMovil();
        String email = cliente.getEmail();
        String nif = cliente.getNif();
        String telefono1 = cliente.getTelefono1();
        String telefono2 = cliente.getTelefono2();
        String fax = cliente.getFax();
        String personaContacto = cliente.getPersonaContacto();
        String observacion = cliente.getObservacion();
        String localidad = cliente.getLocalidad();
        String provincia = cliente.getProvincia();
        int estado = cliente.getEstado();

        Connection con = null;
        Statement st = null;


        try {
            List<Cliente> clientes = obtenerClientes();

            if (clientes.isEmpty()) {
                codigoCliente = "C0001";
            } else {
                codigoCliente = incrementarCodigo(clientes.get(clientes.size() - 1).getCodigoCliente());
            }

            String sql = "insert into cliente (codigo, nombre, nif, email, personacontacto,movil,"
                    + "telefono1, telefono2, fax, direccion, provincia, localidad, cp, observacion, estado)"
                    + " values ('" + codigoCliente + "', '" + nombre + "','" + nif + "', '"
                    + email + "', '" + personaContacto + "', '" + movil + "', '" + telefono1 + "', '"
                    + telefono2 + "', '" + fax + "', '" + direccion + "', '" + provincia + "', '"
                    + localidad + "', '" + codigoPostal + "', '" + observacion + "'," + estado + ");";

            con = Conexion.getConexion();
            st = con.createStatement();
            insertado = st.executeUpdate(sql);
        } catch (Exception e) {
            System.out.println("Error al insertar cliente \n\n" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }

        return insertado;
    }

    public static Cliente obtenerCliente(String codigo) {

        Cliente cliente = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        String sql = "select * from cliente where codigo = '" + codigo + "'";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if (rs.next()) {
                cliente = new Cliente(rs.getString("codigo"), rs.getString("nombre"), rs.getString("nif"),
                        rs.getString("email"), rs.getString("personacontacto"), rs.getString("movil"), rs.getString("telefono1"),
                        rs.getString("telefono2"), rs.getString("fax"), rs.getString("direccion"), rs.getString("provincia"),
                        rs.getString("localidad"), rs.getString("cp"), rs.getString("observacion"), rs.getInt("estado"));
            }
            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al cargar al cliente " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return cliente;
    }

    public static List<Cliente> obtenerClientes() {

        List<Cliente> listaclientes = new ArrayList<Cliente>();
        Cliente cliente = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        String sql = "select * from cliente ;";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            while (rs.next()) {
                cliente = new Cliente(rs.getString("codigo"), rs.getString("nombre"), rs.getString("nif"),
                        rs.getString("email"), rs.getString("personacontacto"), rs.getString("movil"), rs.getString("telefono1"),
                        rs.getString("telefono2"), rs.getString("fax"), rs.getString("direccion"), rs.getString("provincia"),
                        rs.getString("localidad"), rs.getString("cp"), rs.getString("observacion"), rs.getInt("estado"));
                listaclientes.add(cliente);
            }
            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al cargar al cliente " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return listaclientes;

    }
    
    public static List<Cliente> obtenerClientesPaginacion( int limit, int offset) {

        List<Cliente> listaclientes = new ArrayList<Cliente>();
        Cliente cliente = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        String sql = "select * from cliente order by nombre LIMIT "+ limit +" OFFSET "+ offset +";";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            while (rs.next()) {
                cliente = new Cliente(rs.getString("codigo"), rs.getString("nombre"), rs.getString("nif"),
                        rs.getString("email"), rs.getString("personacontacto"), rs.getString("movil"), rs.getString("telefono1"),
                        rs.getString("telefono2"), rs.getString("fax"), rs.getString("direccion"), rs.getString("provincia"),
                        rs.getString("localidad"), rs.getString("cp"), rs.getString("observacion"), rs.getInt("estado"));
                listaclientes.add(cliente);
            }
            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al cargar al cliente " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return listaclientes;

    }

    public static int totalClientes(){
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        
        int totalRegistros = 0;

        String sql = "select count(*) total from cliente ;";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if (rs.next()) {
                totalRegistros = rs.getInt("total");
            }
            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al cargar al cliente " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return totalRegistros;
    }
    
    public static int modificarCliente(Cliente c) {
        Connection con = null;
        Statement st = null;
        
        int ret = 0;

        String sql = "update cliente set "
                + "nombre =  '" + c.getNombre() + "', "
                + "nif =  '" + c.getNif() + "', "
                + "email = '" + c.getEmail() + "', "
                + "personacontacto = '" + c.getPersonaContacto() + "', "
                + "movil = '" + c.getMovil() + "', "
                + "telefono1 = '" + c.getTelefono1() + "', "
                + "telefono2 = '" + c.getTelefono2() + "', "
                + "fax = '" + c.getFax() + "', "
                + "direccion = '" + c.getDireccion() + "', "
                + "provincia = '" + c.getProvincia() + "', "
                + "localidad = '" + c.getLocalidad() + "', "
                + "cp = '" + c.getCodigoPostal() + "', "
                + "observacion = '" + c.getObservacion() + "', "
                + "estado = " + c.getEstado() + " "
                + "where codigo = '" + c.getCodigoCliente() + "'";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            ret = st.executeUpdate(sql);
        } catch (Exception e) {
            System.out.println("Error al modificar cliente" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        
        return ret;
    }

    public static int bajaCliente(String codigo) {

        int insertado = 0;
        Connection con = null;
        Statement st = null;
        DateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
        String fecha = formato.format(new Date());
       
        String sql = "update cliente set estado = '0' , fechaBaja =  '" + fecha 
                + "' where codigo = '" + codigo + "'" ;
        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            insertado = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Error al dar de  cliente" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }
    
    public static int altaCliente(String codigo) {

        int insertado = 0;
        Connection con = null;
        Statement st = null;
        DateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
        String fecha = formato.format(new Date());
       
        String sql = "update cliente set estado = '1' , fechaBaja =  '" + fecha 
                + "' where codigo = '" + codigo + "'" ;
        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            insertado = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Cliente dado de alta correctamente" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }
    

    public static String incrementarCodigo(String codigoCliente) {
        char[] cadena = codigoCliente.toCharArray();
        boolean encontrado = false;
        int j = cadena.length - 1;
        while (encontrado == false && j > 0) {
            if (cadena[j] == '9') {
                cadena[j] = '0';
                j--;
            } else {
                cadena[j]++;
                encontrado = true;
            }
        }
        String devuelta = new String(cadena);
        return devuelta;
    }
}
